#define midea_collection_view_show 1
#if midea_collection_view_show

#ifndef MIDEA_COLLECTION_VIEW
#define MIDEA_COLLECTION_VIEW
#ifdef __cplusplus
extern "C"
{
#endif

#include "lvgl.h"
#include "../base_scroll_ui/midea_dynamic_load_config.h"

// 默认type
#define DEFAULT_COLLECTION_UI_TYPE 0
// 不设置ui_type (无效type)
//  #define NO_COLLECTION_UI_TYPE ((1 << 8) - 1)
// 当涉及修改ui_type方法时传此参数 则忽略修改
#define NOT_SET_COLLECTION_UI_TYPE ((1 << 8) - 1)

#define DEFAULT_COLLECTION_GAP 10

    // 动态加载tag
    //  typedef enum {
    //      COLLECTION_LOAD_AND_FREE = 0, //动态加载 + 动态释放
    //      COLLECTION_LOAD_NOT_FREE, //动态加载 + 不动态释放
    //      COLLECTION_NO_LOAD_AND_FREE, //不动态加载 + 不动态释放
    //  } midea_collection_dynamic_load_tag;

    // 初始化加载“卡片”的数量
    //  #define MIDEA_COLLECTON_LOAD_ITEM_COUNT 8

    // 懒加载一次加载UI的最少数量
    //  #define MIDEA_COLLECTON_LAZY_MIN_ITEM_COUNT 2

    // 用户数据
    // 存放外部调用者传入的数据（双链表 提供增删改查）

    // typedef struct midea_collection_view_data {
    //     void *data;
    // } midea_collection_view_data;

    typedef struct
    {
        // midea_collection_view_data ***page_data; //(midea_collection_view_data *) 类型的二维数组
        void *data;
        struct midea_collection_view_data *next; // 下一页数据
        struct midea_collection_view_data *prev; // 上一页数据
        uint8_t ui_type;                         // UI样式
    } midea_collection_view_data;

    // 数据源（一个数据源和一个list_view相对应）
    // 管理一个数据源的所有外部数据（datasource_list_data） 和 UI初始化/刷新回调
    typedef struct
    {
        lv_obj_t lv_collection_view;

        void (*update_collection)(void *data, lv_obj_t *item_view, int32_t index, uint8_t ui_type);
        void (*install_collection)(void *data, lv_obj_t *item_view, int32_t index, uint8_t ui_type);
        void (*free_data)(void *data);
        // 对比用户data是否一致
        bool (*is_same_data_func)(const void *data1, const void *data2);
        // 创建collection item的方法
        // 没有的话用默认lv_obj_create()
        lv_obj_t *(*create_item)(void *data, lv_obj_t *parent, int32_t index, uint8_t ui_type);

        char *collection_name; // 保证唯一
        midea_collection_view_data *collection_head;
        midea_collection_view_data *collection_tail;
        uint16_t count; // item数量 动态更新
        lv_dir_t direction;
        midea_dynamic_load_t dynamic_load_tag;
        // bool support_lazy_loading; //支持懒加载 默认true
    } midea_collection_view;

    // 其他组件可以调用或继承
    extern const lv_obj_class_t midea_collection_view_class;

    // 所有数据源
    // 管理所有数据源 （如果存在多个list_view时用到）
    typedef struct
    {
        midea_collection_view *midea_collection_view;
        struct midea_all_collection_view *next;
        struct midea_all_collection_view *prev;
    } midea_all_collection_view;

    // 是否存在相同的collection_name
    bool is_same_midea_collection_name_exist(const char *collection_name);

    // 从指定索引开始删除所有之后的子UI
    //  void midea_collection_delete_ui_item_from_index(midea_collection_view *collection, int32_t index);

    lv_obj_t *create_midea_collection(const char *collection_name,
                                      lv_obj_t *parent_view,
                                      lv_dir_t direction,
                                      void (*update_collection)(void *data, lv_obj_t *item_view, int32_t index, uint8_t ui_type),
                                      void (*install_collection)(void *data, lv_obj_t *item_view, int32_t index, uint8_t ui_type),
                                      void (*free_data)(void *data));

    // 末尾增加
    void add_midea_collection_data(const char *collection_name, void *data, uint8_t ui_type);
    // 按索引增加
    void add_midea_collection_data_with_index(const char *collection_name, void *data, int32_t index, uint8_t ui_type);

    // 按索引删除
    void remove_midea_collection_data(const char *collection_name, int32_t index);

    // 删除所有数据
    void remove_midea_all_collection_data(const char *collection_name);

    // 按索引修改
    void reset_midea_collection_data_with_index(const char *collection_name, int32_t index, const void *new_data, uint8_t ui_type);

    // 对比数据并修改数据
    // 调用者提供对比方法
    // new_data为空则不修改
    void reset_midea_collection_data_with_data(const char *collection_name, const void *check_data, const void *new_data, uint8_t ui_type);

    // 刷新列表
    void update_midea_collection(const char *collection_name);

    // 按索引刷新
    void update_midea_collection_with_index(const char *collection_name, int32_t index);

    // 根据索引获取数据
    void *midea_collection_get_data_with_index(const char *collection_name, int32_t index);

    // 根据数据获取索引 不存在返回-1
    int32_t midea_collection_get_index_with_data(const char *collection_name, void *data);

    // 添加用户数据对比方法
    void midea_collection_set_data_check_func(const char *collection_name, bool (*is_same_data_func)(const void *par1, const void *par2));

    // 添加用户collection item 创建方法
    void midea_collection_set_item_create_func(const char *collection_name, lv_obj_t *(*create_item)(void *data, lv_obj_t *parent, int32_t index, uint8_t ui_type));

    // 修改懒加载设置
    void midea_collection_set_dynamic_load_tag(const char *collection_name, midea_dynamic_load_t load_tag);

    //@brief 修改每个cell之间的间距
    //@param gap_hor 水平间距
    //@param gap_ver 垂直间距
    void midea_collection_set_gap(const char *collection_name, lv_coord_t gap_hor, lv_coord_t gap_ver);

    // 获取data数量
    uint16_t midea_collection_get_data_count(const char *collection_name);

    //------------------------
    // 不常用接口
    //------------------------

    // 添加collection_view到总链表
    void add_midea_collection_to_all(midea_collection_view *midea_collection_view);
    // 从总链表删除collection_view
    void remove_midea_collection_from_all(const char *collection_name);

    midea_collection_view *get_midea_collection_from_all(const char *collection_name);

    // 删除collection_name下的数据源collection和collection本身
    void free_midea_collection(const char *collection_name);

    // bool is_same_midea_collection_ui_type(lv_obj_t *item, uint8_t ui_type);
    // 根据ui_type查找cell_ui
    // from ui index
    // 返回 cell
    lv_obj_t *search_midea_collection_item_ui(midea_collection_view *collection, int32_t index, midea_collection_view_data *data);

    // 交换cell_ui位置
    void exchange_midea_collection_item_ui(midea_collection_view *collection, lv_obj_t *cell1, lv_obj_t *cell2);

    // 如果cell ui_type不一致则更新cell
    void reinstall_midea_collection_item_ui(midea_collection_view *collection, lv_obj_t *cell, int32_t index, midea_collection_view_data *data);

    // 在ui index处增加cell
    lv_obj_t *add_midea_collection_item_ui(midea_collection_view *collection, int32_t index, midea_collection_view_data *data, bool set_ui_type);

    // 根据索引滚动到索引位置
    // @note index 在最后一页的范围内时，只能滚动到最后一页
    void scroll_collection_view_to_index(const char *collection_name, int32_t index);

    // 根据数据滚动到数据的位置
    void scroll_collection_view_to_data(const char *collection_name, void *data);

    void scroll_collection_view_to_index_anim(const char *collection_name, int32_t index,int32_t is_anim);

#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif
#endif